package com.edu.test;

import com.edu.bean.User;
import org.junit.Test;

import java.lang.reflect.Field;


public class MyTest02 {

    /**
     *  Field对象
     *      用于描述 class文件中 一个属性的 相关信息 属性名 属性类型 访问修饰符
     *
     *      clazz.getFields() 获取 一个class文件中 的 所有 公有属性的信息。
     *
     *
     */
    @Test
    public void test01(){
        Class clazz = User.class;

        Field[] fields = clazz.getFields();//获取 User.class文件中 所有公有 属性的信息
        for (Field field : fields) {
            System.out.println(field.getName());
            System.out.println(field.getType());
            System.out.println(field.getModifiers());
        }

        System.out.println("------");

        Field[] allFields = clazz.getDeclaredFields();//获取 所有的 公有和私有的属性信息
        for (Field f : allFields) {
            System.out.println("属性名"+f.getName());
            System.out.println("属性数据类型"+f.getType());
            System.out.println("属性访问修饰符"+f.getModifiers());
        }
        System.out.println("------------------");
        try {
            Field filed = clazz.getField("username");//通过 指定的属性名 获取一个 公有的属性的信息s
            System.out.println(filed.getType());
        } catch (NoSuchFieldException e) {
            System.out.println("没有这样的一个公有属性");
            e.printStackTrace();
        }

        try {
            Field field2 = clazz.getDeclaredField("userId"); //获取一个 指定名字的 属性的 信息(不限制公有 私有)
            System.out.println(field2.getType());
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

    /**
     *  Field对象 的一些方法
     */
    @Test
    public void test03(){
        User user = new User();
        User user2 = new User();
        System.out.println(user);
        Class clazz = user.getClass();
        try {
            Field field = clazz.getDeclaredField("username");// 获取了 User.class文件中 username这个属性的信息
            System.out.println("属性名"+field.getName());
            System.out.println("属性数据类型"+field.getType());
            System.out.println("属性访问修饰符"+field.getModifiers());
            field.set(user,"张三");
            System.out.println(user.username);
            System.out.println(field.get(user));

            field.set(user2,"李四");
            System.out.println(field.get(user2));
            System.out.println(user2);
        } catch (NoSuchFieldException e) {
            System.out.println("没有这样一个属性");
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void test04(){
        User user = new User();
        Class clazz = User.class;
        try {
            Field f= clazz.getDeclaredField("userId");
            f.setAccessible(true);//暴力反射
            f.set(user,20);
            System.out.println(user);

            System.out.println(f.get(user));



        } catch (NoSuchFieldException e) {
            System.out.println("该属性不存在");
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            System.out.println("该属性不可被访问");
            e.printStackTrace();
        }


    }
}
